/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import com.thoughtworks.xstream.XStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKArticulo;
import pe.com.cotelasa.scp.controlador.backingBean.BKComposicionArticulo;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.ProveedorArticulo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author DESARROLLO01
 */
@Named(value = "MBArticulo")
@Scope("request")
public class MBArticulo extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = 5948955445845016174L;
    private static Logger logger = Logger.getLogger(MBArticulo.class);
    @Inject
    private BKArticulo bkArticulo;
    @Inject
    private BKComposicionArticulo bkComposicionArticulo;
    @Inject
    private IServicioArticulo servicioArticulos;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Inject
    private IServicioTipoUnidadMinima servicioTipoUnidadMinima;
    private String URL;
    @Autowired
    BKSession session;

    public MBArticulo() {
    }

    public void buscarListaArticulos() {
        try {
            bkArticulo.setListaArticulosActivos(this.servicioArticulos.obtenerArticuloBusqueda(bkArticulo.getArticuloBusqueda()));
            //System.out.println("lista de articulos: "+bkArticulo.getListaArticulosActivos());

            /*if(this.bkArticulo.getComando() != null && this.bkArticulo.getComando().getNombre().equalsIgnoreCase("Guardar")){
             for(Articulo art:bkArticulo.getListaArticulosActivos()){
             System.out.println("categoria: "+art.getIdCategoriaArticulo().getIdCategoriaArticulo().getNombre());
             }
             }
            
             this.bkArticulo.setComando(null);*/

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    @Override
    public String nuevo() {
        this.bkArticulo.setComando(new ComandoGuardar(this));
        bkArticulo.setArticuloFormulario(new Articulo());
        bkComposicionArticulo.setListaArticulo(null);
        inicializarValores();

        return URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
    }

    @Override
    public String editar() {
        this.bkArticulo.setComando(new ComandoActualizar(this));
        inicializarValores();

        try {
            bkArticulo.setArticuloFormulario(servicioArticulos.conseguirArticuloPorId(bkArticulo.getArticuloFormulario().getId()));
            Articulo articulo = bkArticulo.getArticuloFormulario();
            if (articulo.getIdCategoriaArticulo().getTipoCategoria() == 'H') {

                bkArticulo.setIdCategoriaArticulo(articulo.getIdCategoriaArticulo().getIdCategoriaArticulo().getId());
                CategoriaArticulo cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticulo());
                bkArticulo.setListaSubCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasHijos(cat));
                bkArticulo.setIdSubCategoriaArticulo(articulo.getIdCategoriaArticulo().getId());
            } else {
                bkArticulo.setIdCategoriaArticulo(articulo.getIdCategoriaArticulo().getId());
            }

            if (articulo.getIdCategoriaArticulo().getTipoMaterial() == 'C') {
                ComposicionArticulo compArti = new ComposicionArticulo();
                compArti.setIdArticulo(articulo);
                bkComposicionArticulo.getListaArticuloEditar().addAll(servicioComposicionArticulo.buscarComposicionPorArticulo(compArti));
                for (ComposicionArticulo comArt : bkComposicionArticulo.getListaArticuloEditar()) {
                    if (comArt.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        if (comArt.getTipo().equals("%")) {
                            bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().add(comArt.getCantidad()));
                        }
                        bkComposicionArticulo.getListaArticulo().add(comArt);
                    }
                }
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
    }

    @Override
    public String ver() {
        editar();
        bkArticulo.setVerFormulario(true);
        return URLPaginacion.Articulos.URL_VER_ARTICULOS;
    }

    @Override
    public String guardar() {
        Articulo articulo = bkArticulo.getArticuloFormulario();
        articulo.setUsrCreacion(session.getUsuario().getUsuario());
        articulo.setFecCreacion(new Date());
        
        articulo.setNombreComercial(UtilitarioCadenas.formatearCadena(articulo.getNombreComercial()));
        articulo.setModelo(UtilitarioCadenas.formatearCadena(articulo.getModelo()));
        articulo.setDetalle(UtilitarioCadenas.formatearCadena(articulo.getDetalle()));
        
        try {
            if (bkComposicionArticulo.getSumaCantidad().doubleValue() <= 0 || bkComposicionArticulo.getSumaCantidad().doubleValue() >= 100) {
                //articulo.setIdCategoriaArticulo(servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticulo()));
                if (servicioArticulos.obtenerArticuloPorNombreComercial(articulo.getNombreComercial()) == null) {
                    servicioArticulos.guardarArticulo(articulo);
                    if (articulo.getIdCategoriaArticulo().getTipoMaterial() == 'C') {
                        for (ComposicionArticulo compArticulo : bkComposicionArticulo.getListaArticulo()) {

                            compArticulo.setIdArticulo(articulo);
                            servicioComposicionArticulo.guardarComposicionArticulo(compArticulo);
                        }
                    }
                    //articulo.setComposicionArticuloCollection(bkComposicionArticulo.getListaArticulo());
                    //servicioArticulos.guardarArticulo(articulo);

                    mostrarMensaje("Se guardo el articulo satisfactoriamente.");
                    //URL = mostrarMantenimiento();
                    buscarListaArticulos();
                    URL = URLPaginacion.Articulos.URL_LISTA_ARTICULOS;


                } else {
                    mostrarError("El nombre del articulo ya fue registrado.");
                    URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
                }


            } else {
                mostrarError("La composicion debe sumar 100%");
                URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
        }
        return URL;
    }

    @Override
    public String actualizar() {
        Articulo articulo = bkArticulo.getArticuloFormulario();
        
        articulo.setNombreComercial(UtilitarioCadenas.formatearCadena(articulo.getNombreComercial()));
        articulo.setModelo(UtilitarioCadenas.formatearCadena(articulo.getModelo()));
        articulo.setDetalle(UtilitarioCadenas.formatearCadena(articulo.getDetalle()));
        
        articulo.setUsrModificacion(session.getUsuario().getUsuario());
        articulo.setFecModificacion(new Date());
        try {
            if (bkComposicionArticulo.getSumaCantidad().doubleValue() <= 0 || bkComposicionArticulo.getSumaCantidad().doubleValue() >= 100) {

                Articulo articuloBusq = servicioArticulos.obtenerArticuloPorNombreComercial(articulo.getNombreComercial());
                boolean encontro = false;
                if (articuloBusq != null) {
                    if (!articuloBusq.equals(articulo)) {
                        encontro = true;
                    }
                }
                if (!encontro) {
                    servicioArticulos.actualizarArticulo(articulo);
                    for (ComposicionArticulo compArticulo : bkComposicionArticulo.getListaArticuloEditar()) {
                        if (compArticulo.getId() == null) {
                            compArticulo.setIdArticulo(articulo);
                            servicioComposicionArticulo.guardarComposicionArticulo(compArticulo);
                        } else {
                            servicioComposicionArticulo.actualizarComposicionArticulo(compArticulo);
                        }
                    }
                    //articulo.setComposicionArticuloCollection(bkComposicionArticulo.getListaArticuloEditar());
                    //servicioArticulos.actualizarArticulo(articulo);

                    mostrarMensaje("Se actualizo los datos del articulo satisfactoriamente.");
                    //URL = mostrarMantenimiento();
                    buscarListaArticulos();
                    URL = URLPaginacion.Articulos.URL_LISTA_ARTICULOS;
                } else {
                    mostrarError("El nombre del articulo ya fue registrado.");
                    URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
                }

            } else {
                mostrarError("La composicion debe sumar 100%");
                URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Articulos.URL_FORMULARIO_ARTICULOS;
        }
        return URL;
    }

    public String mostrarMantenimiento() {
        bkArticulo.setArticuloBusqueda(new Articulo());
        bkArticulo.getArticuloBusqueda().setNombreComercial("");
        bkArticulo.getArticuloBusqueda().setModelo("");
        bkArticulo.getArticuloBusqueda().setDetalle("");
        bkArticulo.setArticuloFormulario(new Articulo());
        bkArticulo.setListaArticulosActivos(null);
        inicializarValores();
        bkArticulo.setIdCategoriaArticuloReporte(0);
        bkArticulo.setIdSubCategoriaArticuloReporte(0);
        bkArticulo.setListaSubCategoriaArticuloReporte(null);
        bkArticulo.setListaModelosReporte(new ArrayList<String>());
        bkArticulo.setListaModelosReporteElegidos(null);
        /*try {
            bkArticulo.setListaModelosDistintos(servicioArticulos.listarModelosDistintos(new Articulo()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }*/
        return URLPaginacion.Articulos.URL_LISTA_ARTICULOS;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        Articulo articulo = bkArticulo.getArticuloSeleccionado();

        try {
            articulo = servicioArticulos.conseguirArticuloPorId(articulo.getId());

            articulo.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            articulo.setUsrModificacion(session.getUsuario().getUsuario());
            articulo.setFecModificacion(new Date());

            for (ComposicionArticulo comp : articulo.getArticuloComposicionCollection()) {
                if (comp.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    System.out.println("id comp: " + comp.getId());
                    comp.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                    comp.setUsrModificacion(session.getUsuario().getUsuario());
                    comp.setFecModificacion(new Date());
                }

            }

            for (ProveedorArticulo prove : articulo.getProveedorArticuloCollection()) {
                if (prove.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    System.out.println("proveedor en donde esta; " + prove.getProveedor());
                    System.out.println("articulo en donde esta; " + prove.getArticulo());
                    prove.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                    prove.setUsrModificacion(session.getUsuario().getUsuario());
                    prove.setFecModificacion(new Date());
                }

            }

            //servicioArticulos.actualizarArticulo(articulo);
            bkArticulo.setListaArticulosActivos(servicioArticulos.obtenerArticuloBusqueda(bkArticulo.getArticuloBusqueda()));
            mostrarMensaje("Se elimino el articulo satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarSubCategorias() {
        try {
            if (bkArticulo.getIdCategoriaArticulo() != 0) {
                CategoriaArticulo cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticulo());
                bkArticulo.setListaSubCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasHijos(cat));
                bkArticulo.getArticuloFormulario().setIdCategoriaArticulo(cat);
                bkArticulo.getArticuloBusqueda().setIdCategoriaArticulo(cat);
            } else {
                bkArticulo.setListaSubCategoriaArticulo(null);
                bkArticulo.setIdSubCategoriaArticulo(0);
                bkArticulo.getArticuloFormulario().setIdCategoriaArticulo(null);
                bkArticulo.getArticuloBusqueda().setIdCategoriaArticulo(null);
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void seleccionarSubCategorias() {
        try {
            CategoriaArticulo cat = null;
            if (bkArticulo.getIdSubCategoriaArticulo() != null) {
                cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdSubCategoriaArticulo());
                bkArticulo.getArticuloFormulario().setIdCategoriaArticulo(cat);
                bkArticulo.getArticuloBusqueda().setIdCategoriaArticulo(cat);
            } else {
                cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticulo());
                bkArticulo.getArticuloFormulario().setIdCategoriaArticulo(new CategoriaArticulo());
                bkArticulo.getArticuloBusqueda().setIdCategoriaArticulo(cat);
            }
            bkArticulo.setListaModelosDistintos(servicioArticulos.listarModelosDistintos(bkArticulo.getArticuloBusqueda()));
            armarNombreComercial();
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void buscarSubCategoriasReporte() {
        try {
            System.out.println("id categoria: " + bkArticulo.getIdCategoriaArticuloReporte());
            if (bkArticulo.getIdCategoriaArticuloReporte() != 0) {
                CategoriaArticulo cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticuloReporte());
                bkArticulo.setListaSubCategoriaArticuloReporte(servicioCategoriaArticulo.listarCategoriasHijos(cat));
            } else {
                bkArticulo.setListaSubCategoriaArticuloReporte(null);
                bkArticulo.setIdSubCategoriaArticuloReporte(0);
            }

            System.out.println("lista: " + bkArticulo.getListaSubCategoriaArticuloReporte());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void seleccionarSubCategoriaReporte() {
        try {
            CategoriaArticulo cat = null;
            bkArticulo.setListaModelosReporte(new ArrayList<String>());
            if (bkArticulo.getIdSubCategoriaArticuloReporte() != 0) {
                cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdSubCategoriaArticuloReporte());
                Articulo articulo = new Articulo();
                articulo.setIdCategoriaArticulo(cat);
                bkArticulo.getListaModelosReporte().addAll(servicioArticulos.listarModelosDistintos(articulo));
                bkArticulo.setListaModelosReporteElegidos(new ArrayList<String>());
                bkArticulo.setMarcarTodo(false);
            } else {
                bkArticulo.setListaModelosReporteElegidos(null);
            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void inicializarValores() {
        bkArticulo.setVerFormulario(false);
        bkArticulo.setIdCategoriaArticulo(0);
        bkArticulo.setIdSubCategoriaArticulo(0);
        bkArticulo.setListaSubCategoriaArticulo(null);
        bkComposicionArticulo.setListaArticulo(new ArrayList<ComposicionArticulo>());
        bkComposicionArticulo.setListaArticuloEditar(new ArrayList<ComposicionArticulo>());
        bkComposicionArticulo.setListaArticuloActivos(null);
        bkComposicionArticulo.setIdCategoriaArticulo(null);
        bkComposicionArticulo.setSumaCantidad(BigDecimal.ZERO);
        try {
            bkArticulo.setListaCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasPadres());
            bkComposicionArticulo.setListaCategoriaArticuloActivos(servicioCategoriaArticulo.listarCategoriasArticulosActivos());
            bkComposicionArticulo.setListaTipoUnidadMinima(servicioTipoUnidadMinima.listarTipoUnidadMinimasActivos());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void armarDescripcion() {
        Articulo articulo = bkArticulo.getArticuloFormulario();
        String descripcion = "";
        if (articulo.getModelo() != null) {
            descripcion += articulo.getModelo();
        }
        if (!bkComposicionArticulo.getListaArticulo().isEmpty()) {
            for (ComposicionArticulo comp : bkComposicionArticulo.getListaArticulo()) {
                descripcion += " " + comp.getIdArticuloComp().getDescripcion() + " +";
            }
            descripcion = descripcion.substring(0, descripcion.length() - 2);
        }

        if (articulo.getDetalle() != null) {
            descripcion += " " + articulo.getDetalle();
        }
        bkArticulo.getArticuloFormulario().setDescripcion(descripcion);

    }

    public void armarNombreComercial() {
        Articulo articulo = bkArticulo.getArticuloFormulario();
        String nombreComercial = "";
        if (articulo.getIdCategoriaArticulo() != null && !articulo.getIdCategoriaArticulo().getNombre().equals("")) {
            nombreComercial += articulo.getIdCategoriaArticulo().getNombre();
        }
        if (articulo.getModelo() != null && !articulo.getModelo().equals("")) {
            nombreComercial += " " + articulo.getModelo();
        }
        if (articulo.getDetalle() != null && !articulo.getDetalle().equals("")) {
            //descripcion += " " + articulo.getDetalle();
            nombreComercial += " \"" + articulo.getDetalle() + "\"";
        }
        bkArticulo.getArticuloFormulario().setNombreComercial(nombreComercial);

    }

    @Override
    public String aceptar() {
        try {
            servicioArticulos.actualizarArticulo(bkArticulo.getArticuloFormulario());
            bkArticulo.setArticuloFormulario(servicioArticulos.conseguirArticuloPorId(1));
            bkArticulo.setListaArticulosActivos(servicioArticulos.listarArticulosActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Articulos.URL_LISTA_ARTICULOS;
    }

    @Override
    public String retroceder() {
        return URLPaginacion.Articulos.URL_LISTA_ARTICULOS;
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Articulos.URL_LISTA_ARTICULOS;
    }

    /**
     * ********************* CARGA Art ANTIGUA *****************************
     */
    public void inicializarCargaAnt(ActionEvent actionEvent) {

        this.bkArticulo.setIdCategoriaArticuloAnt(null);
        this.bkArticulo.setListaArticuloAnt(null);
        this.bkArticulo.setIdArticuloAnt(null);
        try {
            this.bkArticulo.setListaCategoriaArticuloAnt(servicioCategoriaArticulo.listarCategoriasArticulosActivos());
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void buscarArticuloAnt() {
        try {

            /* if (this.bkComposicionArticulo.getIdCategoriaArticulo() == 0) {
             this.bkComposicionArticulo.setListaArticuloActivos(null);
             this.bkComposicionArticulo.setIdArticulo(null);
             } else {*/
            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkArticulo.getIdCategoriaArticuloAnt());
            this.bkArticulo.setListaArticuloAnt(servicioArticulos.listarArticulosPorCategoria(articulo));
            //}
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void aplicarDatosAntiguos(ActionEvent actionEvent) {
        inicializarValores();
        try {
            Articulo articuloAnt = servicioArticulos.conseguirArticuloPorId(this.bkArticulo.getIdArticuloAnt().getId());
            Articulo articuloForm = new Articulo();
            articuloForm.setDatosTecnicos(articuloAnt.getDatosTecnicos());
            articuloForm.setDescripcion(articuloAnt.getDescripcion());
            articuloForm.setDetalle(articuloAnt.getDetalle());
            articuloForm.setFecCreacion(new Date());
            articuloForm.setIdCategoriaArticulo(articuloAnt.getIdCategoriaArticulo());
            articuloForm.setModelo(articuloAnt.getModelo());
            articuloForm.setNombreComercial(articuloAnt.getNombreComercial());
            articuloForm.setUsrCreacion(session.getUsuario().getUsuario());

            bkArticulo.setArticuloFormulario(articuloForm);


            if (articuloForm.getIdCategoriaArticulo().getTipoCategoria() == 'H') {

                bkArticulo.setIdCategoriaArticulo(articuloForm.getIdCategoriaArticulo().getIdCategoriaArticulo().getId());
                CategoriaArticulo cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdCategoriaArticulo());
                bkArticulo.setListaSubCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasHijos(cat));
                bkArticulo.setIdSubCategoriaArticulo(articuloForm.getIdCategoriaArticulo().getId());
            } else {
                bkArticulo.setIdCategoriaArticulo(articuloForm.getIdCategoriaArticulo().getId());
            }

            if (articuloAnt.getIdCategoriaArticulo().getTipoMaterial() == 'C') {
                ComposicionArticulo compArti = new ComposicionArticulo();
                compArti.setIdArticulo(articuloAnt);
                for (ComposicionArticulo comArt : servicioComposicionArticulo.buscarComposicionPorArticulo(compArti)) {
                    if (comArt.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        ComposicionArticulo compAdd = new ComposicionArticulo();
                        compAdd.setCantidad(comArt.getCantidad());
                        compAdd.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                        compAdd.setFecCreacion(new Date());
                        compAdd.setIdArticuloComp(comArt.getIdArticuloComp());
                        compAdd.setTipo(comArt.getTipo());
                        compAdd.setUsrCreacion(session.getUsuario().getUsuario());
                        this.bkComposicionArticulo.getListaArticulo().add(compAdd);
                        this.bkComposicionArticulo.getListaArticuloEditar().add(compAdd);
                    }

                }
            }

            bkArticulo.getArticuloFormulario().setId(null);

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }



        /*OrdenCompraServicio orden = bkOrdenCompra.getOrdenCompraServicioFormulario();
         iniciarEdicion(orden);*/
    }

    public void reporteModelos() throws IOException {
        Collection<Articulo> lista = new ArrayList<Articulo>();
        Collection<String> modelos = bkArticulo.getListaModelosReporteElegidos();

        /*if (bkArticulo.getListaModelosReporteElegidos().get(0).equalsIgnoreCase("0")) {
            modelos = bkArticulo.getListaModelosReporte();
        } else {
            modelos = bkArticulo.getListaModelosReporteElegidos();
        }*/
        Articulo artBusqueda = new Articulo();
        try {
            artBusqueda.setIdCategoriaArticulo(servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bkArticulo.getIdSubCategoriaArticuloReporte()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        System.out.println("lista: " + lista);

        HSSFWorkbook wb = new HSSFWorkbook();

        HSSFSheet sheet = wb.createSheet("General");

        sheet.setAutobreaks(true);
        sheet.setAlternativeFormula(true);
        sheet.setColumnWidth(0, 1000);
        sheet.setColumnWidth(1, 12000);
        sheet.setColumnWidth(2, 7000);
        sheet.setColumnWidth(3, 7000);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle titStyle = wb.createCellStyle();
        titStyle.setFont(titFont);
        titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderStyle);
        cabStyle.setWrapText(true);
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente normal ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setFontHeightInPoints(Short.valueOf("7"));


        HSSFCellStyle genStyleL = wb.createCellStyle();
        genStyleL.cloneStyleFrom(borderDotStyle);
        genStyleL.setFont(genFont);
        genStyleL.setWrapText(true);

        HSSFCellStyle genStyleN = wb.createCellStyle();
        genStyleN.cloneStyleFrom(borderDotStyle);
        genStyleN.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        genStyleN.setFont(genFont);
        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.VIOLET.index, (byte) 153, (byte) 153, (byte) 255);

        /**
         * ***** fuente para resultado ******************
         */
        HSSFFont resFont = wb.createFont();
        resFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        resFont.setColor(HSSFColor.WHITE.index);
        resFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle resStyle = wb.createCellStyle();

        resStyle.cloneStyleFrom(borderDotStyle);
        resStyle.setFillForegroundColor(HSSFColor.VIOLET.index);
        resStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        resStyle.setFont(resFont);


        HSSFRow row = sheet.createRow(1);

        HSSFCell cell = row.createCell(0);

        cell.setCellStyle(titStyle);
        cell.setCellValue("REPORTE ARTICULOS POR MODELO DE " + artBusqueda.getIdCategoriaArticulo().getNombre());
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 3);
        sheet.addMergedRegion(region);

        int rowCont = 3;
        rowCont++;

        for (String modelo : modelos) {
            int i = 1;
            row = sheet.createRow(rowCont);
            cell = row.createCell(0);
            cell.setCellStyle(resStyle);
            cell.setCellValue(modelo);

            region = new CellRangeAddress(rowCont, rowCont, 0, 3);
            RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, region, sheet, wb);
            RegionUtil.setBorderTop(CellStyle.BORDER_THIN, region, sheet, wb);

            sheet.addMergedRegion(region);

            try {
                Articulo articuloBusqueda = new Articulo(); 
                articuloBusqueda.setModelo(modelo);
                lista = servicioArticulos.buscarArticulosPorModelo(articuloBusqueda);
            } catch (ServiceException e) {
                e.printStackTrace();
            }
            rowCont++;
            row = sheet.createRow(rowCont);
            row = armarCabecera(row, cabStyle);
            rowCont++;
            for (Articulo articulo : lista) {
                row = sheet.createRow(rowCont);
                row = armarContenido(row, genStyleL, genStyleN, articulo, i);
                i++;
                rowCont++;

            }
            rowCont += 2;
        }

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Reporte de Articulos.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();


    }

    public HSSFRow armarCabecera(HSSFRow row, HSSFCellStyle titStyle) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue("Nº");

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue("NOMBRE");

        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DETALLE");

        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DATOS TECNICOS");

        return row;
    }

    public HSSFRow armarContenido(HSSFRow row, HSSFCellStyle titStyle, HSSFCellStyle genNStyle, Articulo articulo, int i) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue(i);

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue(articulo.getNombreComercial());

        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue(articulo.getDetalle());

        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue(articulo.getDatosTecnicos());

        return row;
    }
    
    public void marcarTodos(){
        if(bkArticulo.isMarcarTodo()){
            bkArticulo.getListaModelosReporteElegidos().addAll(bkArticulo.getListaModelosReporte());
        }else{
            bkArticulo.getListaModelosReporteElegidos().clear();
        }
    
    
    }
    
}
